/*
 * aeat9000.c
 *
 *  Created on: May 1, 2013
 *      Author: cody
 */


#include "aeat9000.h"

volatile bool msb_inv_flag;
//volatile encoder_value_t aeat_buffer;

/**
 *
 */
void aeat9k_initialize(void)
{
	msb_inv_flag = false;
	// GPIO Initialization
	gpio_set_mode(ZERORST_PORT, GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, ZERORST_PIN);
	gpio_set_mode(ENCRST_PORT, GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, ENCRST_PIN);
	gpio_set_mode(MSBINV_PORT, GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, MSBINV_PIN);
	gpio_set_mode(ENCERR_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, ENCERR_PIN);
	gpio_set_mode(TILTOUT_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, TILTOUT_PIN);
	gpio_set_mode(LOCTEST_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_ANALOG, LOCTEST_PIN);
	gpio_clear(MSBINV_PORT, MSBINV_PIN);
	ssi_initialize(0); // SSI Interface Initialization
}

/**
 *
 */
u32 aeat9k_read_blocking(void)
{
	ssi_start_read(17); // Read 17 bits for AEAT-9000
	while(!ssi_data_ready())
	{
		__asm__("NOP");
	}
	return ssi_read_data_buffer();

}

/**
 *
 */
void aeat9k_read_buffer(encoder_value_t * buf)
{
	ssi_set_ext_buffer(buf);
	ssi_start_read(17);
}

/**
 *
 */
void aeat9k_zero(void)
{
	// Pulse Zero Reset Pin Low
	gpio_clear(ZERORST_PORT, ZERORST_PIN);
	int i;
	for(i = 0; i<8000; i++)
	{
		__asm__("NOP");
	}
	gpio_set(ZERORST_PORT, ZERORST_PIN);
}

/**
 *
 */
void aeat9k_reset(void)
{
	// Pulse Encoder Reset Pin Low
	gpio_clear(ENCRST_PORT, ENCRST_PIN);
	int i;
	for(i = 0; i<8000; i++)
	{
		__asm__("NOP");
	}
	gpio_set(ENCRST_PORT, ENCRST_PIN);

}

/**
 *
 */
bool aeat9k_get_msb_inv()
{
	return msb_inv_flag;
}

/**
 *
 */
void aeat9k_set_msb_inv(bool inv_state)
{
	msb_inv_flag = inv_state;
	if(inv_state)
		gpio_set(MSBINV_PORT, MSBINV_PIN);
	else
		gpio_clear(MSBINV_PORT, MSBINV_PIN);
}

/**
 *
 */
u8 aeat9k_error(void)
{
	if(GPIO_IDR(ENCERR_PORT) & ENCERR_PIN)
		return 1;
	else
		return 0;
}

/* Convert for ADC
u8 aeat9k_loctest(void)
{
	if(GPIO_IDR(LOCTEST_PORT) & LOCTEST_PIN)
		return 1;
	else
		return 0;
}*/

